/*
 *
 * CursoFacade.java
 * Copyright(c) 2013 UcentralSoft, Todos los derechos reservados 
 */
package controlador;

import modelo.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Maneja el acceso a la curso del sistema
 *
 * @version 1.0 [2013/10/13]
 * @author Jorge Barrera
 */
@WebServlet(name = "CursoFacade", urlPatterns = {"/CursoFacade"})
public class CursoFacade extends HttpServlet {

    private CursoDAL dataCurso;
    private SeccionDAL dataSeccion;
    private SeguridadDAL dataSeguridad;

    /**
     * Maneja las peticiones por get al servlet
     *
     * @param request
     * @param response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        ProcessRequest(request, response);
    }

    /**
     * Maneja las peticiones por post al servlet
     *
     * @param request
     * @param response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        ProcessRequest(request, response);
    }

    /**
     * Se encarga de manejar todas las peticiones, evalÃºa el origen y devuelve
     * la información esperada
     *
     * @param request
     * @param response
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    private void ProcessRequest(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        String html = "";
        try {
            dataCurso = new CursoDAL();
            dataSeccion = new SeccionDAL();
            out = response.getWriter();
            String page = request.getParameter("page");
            //Cursos
            if (page.equals("CrearCurso")) {
                response.setContentType("text/html;ISO-8859-1");
                html = CrearCurso(request);
            }
            if (page.equals("ConsultarCursos")) {
                html = ConsultarCursos(request);
                request.setAttribute("ConsultarCursos", html);
                RequestDispatcher view = request.getRequestDispatcher("GestionarCurso.jsp");
                view.forward(request, response);
            }
            if (page.equals("EliminarCurso")) {
                html = EliminarCurso(request);
                request.setAttribute("EliminarCurso", html);
            }
            if (page.equals("ConsultarCurso")) {
                Curso curso = ConsultarCurso(request);
                request.setAttribute("ConsultarCurso", curso);
                RequestDispatcher view = request.getRequestDispatcher("CreacionCurso.jsp");
                view.forward(request, response);
            }
            if (page.equals("ActualizarCurso")) {
                response.setContentType("text/html;ISO-8859-1");
                html = ActualizarCurso(request);
            }
            //Secciones
            if (page.equals("CrearSeccion")) {
                response.setContentType("text/html;ISO-8859-1");
                html = CrearSeccion(request);
            }
            if (page.equals("ConsultarSecciones")) {
                html = ConsultarSecciones(request);
                request.setAttribute("ConsultarSecciones", html);
                RequestDispatcher view = request.getRequestDispatcher("GestionarSeccion.jsp");
                view.forward(request, response);
            }
            if (page.equals("EliminarSeccion")) {
                html = EliminarSeccion(request);
                request.setAttribute("EliminarSeccion", html);
            }
            if (page.equals("ConsultarSeccion")) {
                Seccion seccion = ConsultarSeccion(request);
                String profesor = SeleccionarProfesor(seccion.getIdProfesor());
                String cursos = SeleccionarCurso(seccion.getIdCurso());
                request.setAttribute("ConsultarSeccion", seccion);
                request.setAttribute("SeleccionarProfesor", profesor);
                request.setAttribute("SeleccionarCurso", cursos);
                RequestDispatcher view = request.getRequestDispatcher("CreacionSeccion.jsp");
                view.forward(request, response);
            }
            if (page.equals("ActualizarSeccion")) {
                response.setContentType("text/html;ISO-8859-1");
                html = ActualizarSeccion(request);
            }
            if (page.equals("HorarioSeccion")) {
                Seccion seccion = ConsultarSeccion(request);
                List<HorarioSeccion> horario = SeleccionarHorario(seccion.getId());
                request.setAttribute("ConsultarSeccion", seccion);
                request.setAttribute("ConsultarHorarioSeccion", horario);
                RequestDispatcher view = request.getRequestDispatcher("HorarioSeccion.jsp");
                view.forward(request, response);
            }
            if (page.equals("ActualizarHorarioSeccion")) {
                response.setContentType("text/html;ISO-8859-1");
                html = ActualizarHorarioSeccion(request);
            }
            if (page.equals("Inscripcion")) {
                html = ConsultarSeccionesInscripcion(request);
                request.setAttribute("ConsultarSeccionesInscripcion", html);
                RequestDispatcher view = request.getRequestDispatcher("Inscripcion.jsp");
                view.forward(request, response);
            }
            if (page.equals("CrearInscripcion")) {
                html = CrearInscripcion(request);
            }
        } catch (ServletException | ClassNotFoundException | SQLException | IOException ex) {
            html = "<html><head><script>alert(\"Se presento un error, " + ex.getMessage().replace("\n", "").replace("\t", "").replace(" ", " ").replace(" ", " ").replace("'", "").replace("\"", "") + "\");history.back();</script></head><body></body></html>";
            if (out != null) {
                out.println(html);
                out.close();
            }
        } finally {
            if (out != null) {
                out.println(html);
                out.close();
            }
        }
    }

    /**
     * Registra un nuevo curso en el sistema
     *
     * @param request
     * @return String
     */
    private String CrearCurso(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Curso curso = new Curso();
        curso.setActivo(request.getParameter("rbtActive").equals("Si"));
        curso.setDescripcion(request.getParameter("txtDescription"));
        curso.setMaxSecciones(Integer.parseInt(request.getParameter("txtMax")));
        if (dataCurso.CrearCurso(curso)) {
            msg = "Se registro el curso";
        } else {
            msg = "No se registro el curso, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='Index.html';</script></head><body></body></html>";
    }

    /**
     * Muestra la tabla de edicion de cursos
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String ConsultarCursos(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String noOptions = "";
        HttpSession session = request.getSession(true);
        Usuario usuarioOption = (Usuario) session.getAttribute("Usuario");
        if (usuarioOption != null) {
            if (usuarioOption.getIdRol() != 1) {
                noOptions = "display:none";
            }
        }
        String html = "";
        List<Curso> cursos;
        cursos = dataCurso.ConsultarCursos();
        for (int i = 0; i < cursos.size(); i++) {
            html += "<tr><td>" + cursos.get(i).getDescripcion() + "</td><td>" + cursos.get(i).getMaxSecciones() + "</td><td style=\"text-align:center;" + noOptions + "\"><a href=\"CursoFacade?page=ConsultarCurso&id=" + cursos.get(i).getId() + "\"><img title=\"Editar\" src=\"Images/page_setup.gif\"/></a><a href=\"CursoFacade?page=EliminarCurso&id=" + cursos.get(i).getId() + "\"><img title=\"Eliminar\" src=\"Images/close.gif\"/></a></td></tr>";
        }
        return html;
    }

    /**
     * Pemite eliminar logicamente un curso
     *
     * @param request
     * @return String
     */
    private String EliminarCurso(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Integer id = Integer.parseInt(request.getParameter("id"));
        Curso curso;
        curso = dataCurso.ConsultarCursoPorId(id);
        curso.setActivo(false);
        if (dataCurso.ActualizarCursoPorId(curso)) {
            msg = "Se elimino el curso";
        } else {
            msg = "No se elimino el curso, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='CursoFacade?page=ConsultarCursos';</script></head><body></body></html>";
    }

    /**
     * Permite editar la informacion de un curso
     *
     * @param request
     * @return String
     */
    private String ActualizarCurso(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Curso curso = new Curso();
        curso.setId(Integer.parseInt(request.getParameter("id")));
        curso.setActivo(request.getParameter("rbtActive").equals("Si"));
        curso.setDescripcion(request.getParameter("txtDescription"));
        curso.setMaxSecciones(Integer.parseInt(request.getParameter("txtMax")));
        curso.setActivo(request.getParameter("rbtActive").equals("Si"));
        if (dataCurso.ActualizarCursoPorId(curso)) {
            msg = "Se actualizo el curso";
        } else {
            msg = "No se actualizo el curso, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='Index.html';</script></head><body></body></html>";
    }

    /**
     * Obtiene la informacion de un curso para edicion
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private Curso ConsultarCurso(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        Curso curso;
        Integer id = Integer.parseInt(request.getParameter("id"));
        curso = dataCurso.ConsultarCursoPorId(id);
        return curso;
    }

    /**
     * Muestra la lista de los profesores
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String SeleccionarCurso(int id) throws ClassNotFoundException, SQLException {
        String html = "";
        try {
            List<Curso> cursos = new Vector<Curso>();
            dataCurso = new CursoDAL();
            cursos = dataCurso.ConsultarCursos();
            for (int i = 0; i < cursos.size(); i++) {
                String selected = id == cursos.get(i).getId() ? "SELECTED" : "";
                html += "<option " + selected + " value=\"" + cursos.get(i).getId() + "\">" + cursos.get(i).getDescripcion() + " (" + cursos.get(i).getId() + ")</option>";
            }
        } catch (Exception e) {
            html = "<html><head><script>alert('Se presento un error, " + e.getMessage().replace("\n", "").replace("'", "") + "');window.location='index.html';</script></head><body></body></html>";
        }
        return html;
    }

    /**
     * Muestra la lista de los profesores
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String SeleccionarProfesor(int id) throws ClassNotFoundException, SQLException {
        String html = "";
        try {
            List<Usuario> usuarios = new Vector<Usuario>();
            dataSeguridad = new SeguridadDAL();
            usuarios = dataSeguridad.ConsultarUsuarios();
            for (int i = 0; i < usuarios.size(); i++) {
                if (usuarios.get(i).getIdRol() == 2) {
                    String selected = id == usuarios.get(i).getId() ? "SELECTED" : "";
                    html += "<option " + selected + " value=\"" + usuarios.get(i).getId() + "\">" + usuarios.get(i).getNombres() + " " + usuarios.get(i).getApellidos() + " (" + usuarios.get(i).getLogin() + ")</option>";
                }
            }
        } catch (Exception e) {
            html = "<html><head><script>alert('Se presento un error, " + e.getMessage().replace("\n", "").replace("'", "") + "');window.location='index.html';</script></head><body></body></html>";
        }
        return html;
    }
    //Secciones

    /**
     * Registra un nuevo seccion en el sistema
     *
     * @param request
     * @return String
     */
    private String CrearSeccion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Seccion seccion = new Seccion();
        seccion.setActivo(request.getParameter("rbtActive").equals("Si"));
        seccion.setIdCurso(Integer.parseInt(request.getParameter("ddlCourse")));
        seccion.setIdProfesor(Integer.parseInt(request.getParameter("ddlTeacher")));
        seccion.setDescripcion(request.getParameter("txtDescription"));
        seccion.setMaxCupos(Integer.parseInt(request.getParameter("txtMax")));
        if (dataSeccion.CrearSeccion(seccion)) {
            msg = "Se registro el seccion";
        } else {
            msg = "No se registro el seccion, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='Index.html';</script></head><body></body></html>";
    }

    /**
     * Muestra la tabla de edicion de secciones
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String ConsultarSecciones(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String noOptions = "";
        HttpSession session = request.getSession(true);
        Usuario usuarioOption = (Usuario) session.getAttribute("Usuario");
        if (usuarioOption != null) {
            if (usuarioOption.getIdRol() != 1) {
                noOptions = "display:none";
            }
        }
        String html = "";
        List<Seccion> secciones;
        secciones = dataSeccion.ConsultarSecciones();
        for (int i = 0; i < secciones.size(); i++) {
            html += "<tr><td>" + secciones.get(i).getDescripcion() + "</td><td>" + secciones.get(i).getMaxCupos() + "</td><td style=\"text-align:center;" + noOptions + "\"><a href=\"CursoFacade?page=ConsultarSeccion&id=" + secciones.get(i).getId() + "\"><img title=\"Editar\" src=\"Images/page_setup.gif\"/></a><a href=\"CursoFacade?page=HorarioSeccion&id=" + secciones.get(i).getId() + "\"><img title=\"Horario\" src=\"Images/about.gif\"/></a><a href=\"CursoFacade?page=EliminarSeccion&id=" + secciones.get(i).getId() + "\"><img title=\"Eliminar\" src=\"Images/close.gif\"/></a></td></tr>";
        }
        return html;
    }

    /**
     * Pemite eliminar logicamente un seccion
     *
     * @param request
     * @return String
     */
    private String EliminarSeccion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Integer id = Integer.parseInt(request.getParameter("id"));
        Seccion seccion;
        seccion = dataSeccion.ConsultarSeccionPorId(id);
        seccion.setActivo(false);
        if (dataSeccion.ActualizarSeccionPorId(seccion)) {
            msg = "Se elimino el seccion";
        } else {
            msg = "No se elimino el seccion, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='CursoFacade?page=ConsultarSecciones';</script></head><body></body></html>";
    }

    /**
     * Permite editar la informacion de un seccion
     *
     * @param request
     * @return String
     */
    private String ActualizarSeccion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;
        Seccion seccion = new Seccion();
        seccion.setId(Integer.parseInt(request.getParameter("id")));
        seccion.setActivo(request.getParameter("rbtActive").equals("Si"));
        seccion.setIdCurso(Integer.parseInt(request.getParameter("ddlCourse")));
        seccion.setIdProfesor(Integer.parseInt(request.getParameter("ddlTeacher")));
        seccion.setDescripcion(request.getParameter("txtDescription"));
        seccion.setMaxCupos(Integer.parseInt(request.getParameter("txtMax")));
        if (dataSeccion.ActualizarSeccionPorId(seccion)) {
            msg = "Se actualizo el seccion";
        } else {
            msg = "No se actualizo el seccion, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='Index.html';</script></head><body></body></html>";
    }

    /**
     * Obtiene la informacion de un seccion para edicion
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private Seccion ConsultarSeccion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        Seccion seccion;
        Integer id = Integer.parseInt(request.getParameter("id"));
        seccion = dataSeccion.ConsultarSeccionPorId(id);
        return seccion;
    }

    /**
     * Permite consultar los horario de una sección
     *
     * @param id
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private List<HorarioSeccion> SeleccionarHorario(int id) throws ClassNotFoundException, SQLException {
        List<HorarioSeccion> horarioSeccion = new Vector<HorarioSeccion>();
        horarioSeccion = dataSeccion.ConsultarHorariosSeccion(id);
        return horarioSeccion;
    }

    /**
     * Permite actualizar los horarios de una seccion
     *
     * @param request
     * @return
     */
    private String ActualizarHorarioSeccion(HttpServletRequest request) {
        String msg = "";
        String val = " ";
        try {
            boolean registro = true;
            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            for (int i = 0; i < 6; i++) {
                HorarioSeccion horario = new HorarioSeccion();
                horario.setIdSeccion(Integer.parseInt(request.getParameter("id")));
                horario.setDiaSemana(i + 1);
                horario.setSalon(request.getParameter("txtSalon" + horario.getDiaSemana()));
                Date txtHoraIni = formatter.parse(request.getParameter("txtHoraIni" + horario.getDiaSemana()));
                Date txtHoraFin = formatter.parse(request.getParameter("txtHoraFin" + horario.getDiaSemana()));
                if (txtHoraFin.before(txtHoraIni)) {
                    txtHoraIni = formatter.parse("00:00:00");
                    txtHoraFin = formatter.parse("00:00:00");
                    val = " En el dia [" + horario.getDiaSemana() + "] la fecha de inicio es mayor a la fecha de fin ";
                    registro = false;
                }
                horario.setHoraInicio(txtHoraIni);
                horario.setHoraFin(txtHoraFin);
                registro = registro && dataSeccion.ActualizarHorarioSeccion(horario);
            }
            if (registro) {
                msg = "Se actualizo el horario";
            } else {
                msg = "No se actualizo el horario," + val + "intente de nuevo";
            }
            return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='CursoFacade?page=ConsultarSecciones';</script></head><body></body></html>";
        } catch (NumberFormatException | ParseException | ClassNotFoundException | SQLException e) {
            msg = "No se actualizo el horario, intente de nuevo";
            return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='CursoFacade?page=ConsultarSecciones';</script></head><body></body></html>";
        }
    }

    /**
     * Muestra la tabla de edicion de secciones
     *
     * @param request
     * @return String
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String ConsultarSeccionesInscripcion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String html = "";
        HttpSession session = request.getSession(true);
        Usuario usuario = (Usuario) session.getAttribute("Usuario");
        List<Seccion> secciones = dataSeccion.ConsultarSeccionesInscripcion(usuario.getId());
        for (int i = 0; i < secciones.size(); i++) {
            String noOptions = "";
            if (secciones.get(i).getMaxCupos() <= 0) {
                noOptions = "display:none";
            }
            html += "<tr><td style=\"text-align:justify;\">" + secciones.get(i).getDescripcion() + "</td><td style=\"text-align:center;" + noOptions + "\"><a href=\"CursoFacade?page=CrearInscripcion&id=" + secciones.get(i).getId() + "\"><img title=\"Inscribir\" src=\"Images/save.gif\"/></a></td></tr>";
        }
        return html;
    }

    /**
     * Crea una inscripcion a la seccion
     *
     * @param request
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    private String CrearInscripcion(HttpServletRequest request) throws ClassNotFoundException, SQLException {
        String msg;

        HttpSession session = request.getSession(true);
        Usuario usuario = (Usuario) session.getAttribute("Usuario");
        if (dataSeccion.CrearInscripcion(Integer.parseInt(request.getParameter("id")), usuario.getId())) {
            msg = "Se inscribio a al grupo";
        } else {
            msg = "No se inscribio al grupo, intente de nuevo";
        }
        return "<html><head><script>alert('" + msg.replace("\n", "").replace("'", "") + "');window.location='CursoFacade?page=Inscripcion';</script></head><body></body></html>";
    }
}
